package bb;

/**
 * Created with IntelliJ IDEA.
 * User: Nacer
 * Date: 18/03/14
 * Time: 10:15
 * To change this template use File | Settings | File Templates.
 */

/** La classe Node, un noeud de l'arbre de décision
 Cette classe est le type pour représenter un noeud de l'arbre de décision.

 Un noeud peut être un noeud interne de l'arbre ou une solution.
 cette classe contient un compteur permettant de compter le nombre de
 solutions postées par le noeud.
 Cette classe définit des méthodes permetant d'obtenir le coût et
 l'évaluation d'un noud. Ces méthodes sont abstraites.
 Un ensemble de méthodes est aussi ajoutée pour la comparaison de noeud.
 Généralement entre un noeud interne et un noeud solution ou entre 2
 noeuds solutions.
 Cette classe est abstraite.
 */
public abstract class Node {
    /** nbsol variable entière représentant le nombre de solution du noeud
     */
    protected int nbsol;

    /** Constructeur par défaut
     */
    public Node() { nbsol=0; }
    /** Constructeur par défaut
     * @param sol le nombre de solutions représenté par le noeud
     */
    public Node(int sol) { nbsol=sol; }
    /** Retourne si le noeud est unesolution ou pas.
     * @return true or false si le noeud est une soluton ou pas.
     */
    boolean isSolution() { return nbsol!=0; }
    /** Retourne le coût du noeud
     * @return le coût entier
     */
    abstract public int getCost();
    /** Retourne l'evaluation du noeud.
     * @return le coût entier
     */
    abstract public int getEval();
    /** Retourne si le noeud est intéressant pour être branché
     * @param s le noeud de reférence à comparer
     * @return true si le noeud peut être exploré, false sinon
     */
    public boolean isBetter(Node s) {
        return isBetter(s.getEval());
    }
    /** Retourne si le noeud est intéressant pour être branché
     * @param s un coût de référence
     * @return true si le noeud peut être exploré, false sinon
     */
    abstract public boolean isBetter(int s);
    /** ajoute un certains nombre de solution à ce noeud.
     * generalement un noeud ne représente qu'une solution donc 1 suffit,
     * mais lorsqu'on gère des symétries, un noeud solution peut en fait
     * représenter plusieurs solutions symétriques.
     * @param cnbsol le nombre de solutions portées par le noeud
     */
    public void addSolution(int cnbsol) { nbsol+=cnbsol; }
    /** le noeud est un noeud solution
     */
    public void setSolution() { nbsol=1; }
}

